import { IHelper } from 'egg';
import { BaseContextClass } from 'egg';
export default abstract class BaseMethods extends BaseContextClass {
  //================= 以下为静态方法 =================
  /**
   * @name 字符串下划线转小驼峰
   */
  static underlineToHump(value: string): string {
    return value.replace(/\_(\w)/g, (_, letter) => letter.toUpperCase());
  }

  /**
   * @name 字符串大小驼峰转下划线
   */
  static humpToUnderline(value: string): string {
    // 首字母需要取出来，直接取小写
    const str1=value.substring(0,1).toLowerCase()
    const str2=value.substring(1,value.length)
    return str1+ str2.replace(/([A-Z])/g, '_$1').toLowerCase()
  }

  /**
   * @name 将对象的key从下划线转换成小驼峰
   * @description 只会转换key ,不会转换值
   * @param {Object} data 需要转换的对象
   */
  static objectKeysUToH<T = object>(data: T): T {
    const underlineToHump = this.underlineToHump;
    let hump = '';
    // 转换对象中的每一个键值为驼峰的递归
    const formatTransferKey = (data) => {
      //
      if (data instanceof Array) {
        data.forEach((item) => formatTransferKey(item));
      } else if (data instanceof Object) {
        for (const key in data) {
          hump = underlineToHump(key);
          data[hump] = data[key];
          // 转换驼峰后，如果和原来的key不一样，那么删掉原来的key
          if (key !== hump) {
            delete data[key];
          }
          if (data[hump] instanceof Object) {
            formatTransferKey(data[hump]);
          }
        }
      }
    };
    formatTransferKey(data);
    return data;
  }
   //================= 以下动态方法 =================


  /**
   * @name 写一条错误日志
   * @param msg 错误日志的提示语
   * @param other 日志要记录的其他信息
   */
  protected whithLog(msg: string, other: any = {}) {
    this.ctx.logger.error(
      msg,
      'query=',
      this.getQuery(),
      'body=',
      this.getBody(),
      other
    );
  }

  /**
   * 获取Query
   */
  protected getQuery() {
    return this.ctx.request.query || {};
  }

  /**
   * 获取Body
   */
  protected getBody<T = any>(): T {
    return this.ctx.request.body || {};
  }

  /**
   * 获取Header上的参数
   */
  protected getHeaders<T = any>(): T {
    return (this.ctx.headers as any) || {};
  }

  /**
   * 获取Router上的参数
   */
  protected getParams(): any {
    return this.ctx.params || {};
  }

  /**
   * 获取Helper
   */
  protected getHelper(): IHelper {
    return this.ctx.helper || {};
  }

  /**
   * 返回成功数据
   */
  protected success(data: any) {
    this.ctx.body = data;
  }

}
